چندین دلیل برای محدود کردن دسترسی کاربر SSH به یک دایرکتوری خاص وجود دارد که مهمترین آن امنیت سیستم است. برای قفل کردن کاربران SSH در یک دایرکتوری مشخص، از مکانیزم chroot استفاده میکنیم.
chroot (مخفف Change Root) در سیستمهای شبهیونیکس مانند لینوکس، یک روش برای جدا کردن عملیاتهای خاص کاربر از بقیه سیستم است. این مکانیزم، دایرکتوری ریشه را برای یک فرآیند در حال اجرا و فرزندانش به یک دایرکتوری ریشه جدید که زندان chroot (Chrooted Jail) نامیده میشود، تغییر میدهد.
در لینوکس، کتابخانه (Library) مجموعهای از توابع (Functions) است که برنامهها میتوانند از آنها استفاده کنند. توابع، قطعههای کد مستقلی هستند که کارهای خاصی را انجام میدهند، مانند باز کردن یک فایل، خواندن داده، یا محاسبه یک مقدار.
به جای اینکه هر برنامه این توابع را داخل خودش داشته باشد، همه برنامهها از یک کتابخانه مشترک استفاده میکنند. این کار باعث صرفهجویی در فضا و سهولت بهروزرسانی میشود.
.a (Archive).so (Shared Object)
در ویندوز، کتابخانههای پویا با پسوند .dll (Dynamic Linked Library) شناخته میشوند که معادل .so در لینوکس هستند.
سیستم برای پیدا کردن کتابخانهها از ترتیب زیر پیروی میکند:
LD_LIBRARY_PATH (اولویت اول)PATH برنامه/etc/ld.so.conf.d/ (فایلهای کانفیگ)/etc/ld.so.conf (کانفیگ اصلی)/lib*/ و /usr/lib*/ (پیشفرض)
ldd مخفف List Dynamic Dependencies است و کتابخانههای پویا (Shared Libraries) که یک برنامه به آنها نیاز دارد را نمایش میدهد.
توضیح: خروجی نشان میدهد که ls به کتابخانههای مختلفی وابسته است. این کتابخانهها باید در محیط chroot نیز موجود باشند تا دستورات به درستی کار کنند.
sudo.openssh-server نصب و فعال باشد.
توضیح: با دستور mkdir -p دایرکتوری /home/test را ایجاد میکنیم. گزینه -p باعث میشود اگر دایرکتوری والد (مثلاً home) وجود نداشته باشد، آن را نیز بسازد. این دایرکتوری به عنوان ریشه جدید (زندان chroot) برای کاربر محصور شده عمل خواهد کرد.
طبق صفحه راهنمای sshd_config، گزینه ChrootDirectory مسیر دایرکتوری را برای chroot پس از احراز هویت مشخص میکند. این دایرکتوری باید شامل فایلها و دایرکتوریهای لازم برای پشتیبانی از جلسه کاربر باشد. برای یک جلسه تعاملی، حداقل به یک شل (معمولاً sh) و گرههای اولیه /dev مانند null، zero، stdin، stdout، stderr و دستگاههای tty نیاز است.
توضیح دستورات:
sudo mkdir -p /home/test/dev → ایجاد دایرکتوری dev در داخل زندان. این دایرکتوری برای نگهداری فایلهای دستگاه (Device Files) ضروری است.
sudo cd /home/test/dev → ورود به دایرکتوری dev برای ایجاد فایلهای دستگاه.
sudo mknod -m 666 null c 1 3 → ایجاد فایل دستگاه null. -m 666 مجوزهای خواندن/نوشتن برای همه کاربران را تنظیم میکند. c یعنی دستگاه کاراکتری (Character Device). 1 3 اعداد اصلی و فرعی (Major/Minor) دستگاه هستند که برای شناسایی آن توسط هسته استفاده میشوند.
sudo mknod -m 666 tty c 5 0 → ایجاد فایل دستگاه tty (ترمینال) با مجوزهای مشابه.
sudo mknod -m 666 zero c 1 5 → ایجاد فایل دستگاه zero که برای تولید کاراکترهای صفر استفاده میشود.
sudo mknod -m 666 random c 1 8 → ایجاد فایل دستگاه random که برای تولید اعداد تصادفی استفاده میشود.
دستور mknod برای ایجاد فایلهای دستگاه (Device Files) استفاده میشود. گزینه -m برای تنظیم مجوزها، c برای دستگاه کاراکتری و دو عدد آخر (Major و Minor) برای شناسایی دستگاه هستند. این فایلها برای عملکرد صحیح محیط chroot حیاتی هستند.
توضیح:
sudo chown root:root /home/test → دایرکتوری chroot را به root (هم مالک و هم گروه) اختصاص میدهد. این یک شرط امنیتی اساسی است: کاربران عادی نباید مالک دایرکتوری ریشه زندان باشند.
sudo chmod 0755 /home/test → مجوزهای rwxr-xr-x را تنظیم میکند. یعنی مالک (root) میتواند بخواند، بنویسد و اجرا کند؛ گروه و دیگران فقط میتوانند بخوانند و اجرا کنند (نمیتوانند بنویسند).
توضیح:
sudo mkdir -p /home/test/bin → ایجاد دایرکتوری bin در زندان برای نگهداری دستورات و شل.
sudo cp -v /bin/bash /home/test/bin/ → کپی کردن فایل اجرایی bash از سیستم اصلی به دایرکتوری bin زندان. گزینه -v (verbose) باعث نمایش جزئیات کپی میشود.
اکنون باید کتابخانههای مورد نیاز bash را شناسایی و کپی کنیم:
توضیح:
sudo ldd /bin/bash → با استفاده از دستور ldd، کتابخانههای پویا (Shared Libraries) مورد نیاز bash را شناسایی میکنیم.
sudo mkdir -p /home/test/lib64 → ایجاد دایرکتوری lib64 در زندان برای نگهداری کتابخانههای ۶۴ بیتی.
sudo cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/test/lib64/ → کپی کردن کتابخانههای شناسایی شده از سیستم اصلی به دایرکتوری lib64 زندان. این کتابخانهها برای اجرای bash در محیط chroot ضروری هستند.
توضیح:
sudo useradd tecmint → ایجاد یک کاربر جدید به نام tecmint. این کاربری است که در زندان chroot محصور خواهد شد.
sudo passwd tecmint → تنظیم رمز عبور برای کاربر tecmint. شما باید یک رمز عبور قوی وارد کنید.
اکنون باید فایلهای /etc/passwd و /etc/group را به زندان کپی کنیم تا کاربر شناسایی شود:
توضیح:
sudo mkdir /home/test/etc → ایجاد دایرکتوری etc در زندان برای نگهداری فایلهای پیکربندی.
sudo cp -vf /etc/{passwd,group} /home/test/etc/ → کپی کردن فایلهای passwd و group از سیستم اصلی به زندان. گزینه -v (verbose) و -f (force) برای نمایش جزئیات و اجبار در کپی استفاده شده است. این فایلها برای تشخیص کاربر در محیط chroot ضروری هستند.
هر بار که کاربر جدیدی به سیستم اضافه میشود، باید فایلهای /etc/passwd و /etc/group را دوباره به محیط chroot کپی کنید تا کاربر جدید نیز قابل شناسایی باشد.
فایل پیکربندی SSH را ویرایش میکنیم:
توضیح: این دستور فایل sshd_config را در ویرایشگر nano باز میکند. این فایل اصلیترین فایل پیکربندی سرویس SSH است.
خطوط زیر را به انتهای فایل اضافه کنید:
توضیح:
Match User tecmint → این بلوک از تنظیمات فقط برای کاربر tecmint اعمال میشود.
ChrootDirectory /home/test → دایرکتوری ریشه (Root) برای این کاربر به /home/test تغییر میکند. یعنی کاربر فکر میکند که /home/test همان ریشه سیستم است.
ForceCommand internal-sftp → (اختیاری) کاربر را فقط به SFTP محدود میکند و اجازه اجرای شل تعاملی را نمیدهد.
پس از ذخیره تغییرات، سرویس SSH را مجدداً راهاندازی میکنیم:
توضیح: با دستور systemctl restart sshd سرویس SSH را مجدداً راهاندازی میکنیم تا تغییرات اعمال شوند. در سیستمهای قدیمیتر ممکن است از service sshd restart استفاده شود.
اکنون با کاربر tecmint به سیستم متصل میشویم:
نتیجه: همانطور که در خروجی مشاهده میکنید، کاربر نمیتواند هیچ دستور خارجی مانند ls، date یا uname را اجرا کند. فقط دستورات داخلی (built-in) bash مانند pwd، echo و history در دسترس هستند. این یعنی کاربر در زندان chroot محصور شده است.
اگر کاربر نتوانست دستورات خارجی را اجرا کند، یعنی chroot به درستی پیکربندی شده است و کاربر فقط به دایرکتوری /home/test دسترسی دارد.
اگر میخواهید کاربر بتواند دستورات خاصی (مثل ls، date، mkdir) را اجرا کند، باید آنها را به زندان اضافه کنید.
ابتدا دایرکتوری خانه کاربر را در زندان ایجاد میکنیم:
توضیح:
sudo mkdir -p /home/test/home/tecmint → ایجاد دایرکتوری خانه برای کاربر tecmint در داخل زندان.
sudo chown -R tecmint:tecmint /home/test/home/tecmint → اختصاص مالکیت دایرکتوری خانه به خود کاربر tecmint (نه root).
sudo chmod -R 0700 /home/test/home/tecmint → تنظیم مجوزها به گونهای که فقط خود کاربر بتواند به دایرکتوری خانه خود دسترسی داشته باشد (rwx برای مالک، هیچ دسترسی برای دیگران).
سپس دستورات مورد نظر را کپی میکنیم:
توضیح: این دستورات فایلهای اجرایی ls، date و mkdir را از سیستم اصلی به دایرکتوری bin زندان کپی میکنند.
حالا باید کتابخانههای مورد نیاز این دستورات را نیز کپی کنیم. ابتدا با ldd آنها را شناسایی میکنیم:
توضیح: با ldd /bin/ls کتابخانههای مورد نیاز ls را شناسایی کرده و سپس آنها را به دایرکتوری lib64 زندان کپی میکنیم. اگر کتابخانهای قبلاً کپی شده باشد، باز هم کپی میشود (با گزینه -v میتوانید ببینید چه چیزی کپی میشود).
اکنون دوباره با کاربر tecmint به سیستم متصل میشویم:
نتیجه: کاربر اکنون میتواند دستورات ls، date و mkdir را در محیط chroot اجرا کند، اما همچنان به فایلهای خارج از زندان /home/test دسترسی ندارد. این یعنی تنظیمات ما با موفقیت انجام شده است.
ldd شناسایی و به lib یا lib64 زندان کپی کنید./etc/passwd و /etc/group را بهروز کنید.ForceCommand internal-sftp در sshd_config استفاده کنید و مطمئن شوید که Subsystem sftp internal-sftp نیز تنظیم شده است./bin/bash: No such file or directory دریافت کردید، /bin/sh را نیز به زندان کپی کنید.PATH را در محیط chroot تنظیم کنید (ایجاد فایل /home/test/etc/profile).| خطا | راهحل |
|---|---|
Permission denied (publickey) |
مسیر authorized_keys را در sshd_config برای کاربر تنظیم کنید یا از احراز هویت با رمز عبور استفاده کنید. |
/bin/bash: No such file or directory |
کتابخانههای bash را بهدرستی کپی نکردهاید. با ldd دوباره بررسی کنید و /bin/sh را نیز کپی کنید. |
client_loop: send disconnect: Broken pipe |
مالکیت دایرکتوری chroot را بررسی کنید (باید root:root باشد) و مجوزها را به 0755 تنظیم کنید. |
ls: command not found |
کتابخانههای مورد نیاز ls را با ldd شناسایی و به زندان کپی کنید. |
error: /dev/pts/2: No such file or directory |
دستگاههای /dev/pts را در زندان mount کنید یا از mknod برای ایجاد آنها استفاده کنید. |
.a) و Shared/Dynamic (.so).ldd: وابستگیهای کتابخانهای یک برنامه را نمایش میدهد.ldd وابستگیهای کتابخانهای برنامههای bash و python3 را بررسی کنید.cp و mv را به chroot اضافه کنید (کتابخانههای آنها را نیز کپی کنید).ForceCommand internal-sftp کاربر را به SFTP محدود کنید و تست کنید./var/log/secure (در رد هت) یا /var/log/auth.log (در دبیان) را برای خطاهای احتمالی بررسی کنید.PATH را در محیط chroot تنظیم کنید تا کاربر بتواند دستورات را بدون مسیر کامل اجرا کند.